Load code

Variables

Load data

Filter data

success

Single lemma

Load data

Check tweets

tweets %>%
  select(tweet, date) %>%
  # slice(., sample(1:n())) #random selection
  arrange(date)

Check uses and edges

df_comp %>%
  filter(LEMMA == 'hyperlocal') %>%
  select(LEMMA, USES_TOT, SUBSET, USES)

Case studies

Data overview

Usage frequency

Overall across cases

df_comp %>%
  filter(
    LEMMA %in% cases,
    SUBSET == 'full'
    ) %>%
   arrange(desc(USES_TOT))

Uses in first subset

df_comp %>%
  filter(
    SUBSETTING == 'time',
    SUBSET == 'one'
    ) %>%
  select(LEMMA, USES_TOT, USES) %>%
  arrange(USES)

Degree centralization

Diachronic

plt <- df_comp %>%
  select(LEMMA, SUBSETTING, SUBSET, CENT_DEGREE, CENT_EV, DENSITY) %>%
  filter(
    SUBSET != 'full',
    LEMMA %in% cases
    # LEMMA %in% c(cases, 'hyperlocal', 'blockchain', 'climate denial', 'man bun', 'upskill', 'deep learning')
    # overtourism: diff too big for case study scale; 
    # , 'broflake', 'climate crisis', 'incel', 'overtourism'
  ) %>%
  ggplot(., aes(x=SUBSET, y=CENT_DEGREE)) + # group=1
    geom_point(aes(group=LEMMA, color=LEMMA, shape=LEMMA)) +
    geom_line(aes(group=LEMMA, color=LEMMA, linetype=LEMMA)) +
    guides(group=TRUE) +
    ggtitle('Diffusion over time: changes in degree centralization') +
    scale_y_continuous('degree centrality') +
    scale_x_discrete('subset')

ggplotly(plt)

# ggsave('out/cases_cent_diac.pdf', width=6, height=4)

Overall

df_comp %>%
  filter(
    LEMMA %in% cases,
    SUBSET == 'full'
    ) %>%
  select(
    LEMMA, 
    EDGES,
    CENT_DEGREE, 
    CENT_EV
    ) %>%
  arrange((CENT_DEGREE))

Full sample

Usage intensity

df_comp %>%
  filter(SUBSET == 'full') %>%
  arrange(desc(USES))

Edges

Degree centrality

Overall

List

df_comp %>%
  select(LEMMA, SUBSET, USES_TOT, CENT_DEGREE, CENT_EV) %>%
  filter(
    SUBSET == 'full'
    # USES >= 2
    ) %>%
  arrange(
    (CENT_DEGREE)
    # desc(CENT_EV)
  )

Plot

plt <- df_comp %>%
  select(LEMMA, SUBSET, USES, CENT_DEGREE) %>%
  filter(SUBSET == 'full') %>%
  arrange((CENT_DEGREE)) %>%
  ggplot(., aes(x=CENT_DEGREE, y=reorder(LEMMA, CENT_DEGREE))) +
    geom_point() +
    scale_y_discrete('lemmas') +
    scale_x_continuous(
      'degree centralization (log)',
      trans='log'
      )

plt


# ggsave('out/cent_sync_all.pdf', width=6, height=4)

Over time

Across all lemmas

df_comp %>%
  filter(
    SUBSET %in% c('one', 'two', 'three', 'four'),
    LEMMA %in% unsuccessful_diffs
    # USES_TOT >= 10000
    # USES > 1000
    ) %>%
  group_by(SUBSET) %>%
  summarize(
    DENS_AVG = mean(DENSITY),
    CENT_AVG = mean(CENT_DEGREE)
    ) %>%
  ggplot(., aes(x=SUBSET, y=DENS_AVG, group=1)) +
    geom_line() +
    geom_point() +
    scale_y_continuous('degree centralization') +
    scale_x_discrete('subsets')


# ggsave('out/full_cent_diac.pdf', width=6, height=4)

Biggest changes

df_comp %>%
  select(LEMMA, SUBSET, CENT_DEGREE, EDGES, USES_TOT) %>%
  filter(
    SUBSET %in% c(
      'one', 
      'four'
      ),
    USES_TOT >= 10000
    ) %>%
  dplyr::group_by(LEMMA) %>%
  dplyr::mutate(CENT_DIFF = CENT_DEGREE - lag(CENT_DEGREE, default=CENT_DEGREE[1])) %>%
  drop_na() %>%
  select(-SUBSET) %>%
  rename(
    CENT_LAST = CENT_DEGREE,
    EDGES_LAST = EDGES
    ) %>%
  arrange((CENT_DIFF))

Density

df_comp %>%
  select(LEMMA, SUBSET, USES_TOT, CENT_DEGREE, DENSITY) %>%
  filter(SUBSET == 'four') %>%
  arrange(DENSITY)

Frequency vs. networks

Frequency vs. centralization

Plot

plt <- df_comp %>%
  filter(
    SUBSET == 'four',
    # USES_TOT %in% (150000:500000)
    # LEMMA %in% c(cases)
    # !LEMMA %in% c('slut shaming', 'dashcam', 'shareable', 'cuckold', 'deep learning', 'hyperlocal')
    ) %>%
  select(LEMMA, CENT_DEGREE, USES_TOT, USES, EDGES) %>%
  ggplot(., aes(x=CENT_DEGREE, y=USES_TOT)) +
    geom_text(aes(label=LEMMA), hjust=-0.1, vjust=-0.1) + 
    # geom_point() +
    scale_y_continuous(
      'usage frequency (log)', 
      trans='log'
      ) +
    scale_x_continuous(
      'degree centralization'
      # trans='log'
      )

ggplotly(plt)

# ggsave('out/full_cent_freq_overall.pdf', width=6, height=4)
# ggsave('out/cases_cent_freq_overall.pdf', width=6, height=4)

Biggest discrepancies

df_comp %>%
  filter(
    SUBSETTING == 'time',
    SUBSET == 'four'
    ) %>%
  select(LEMMA, USES_TOT, CENT_DEGREE) %>%
  mutate(DISC = USES_TOT / CENT_DEGREE) %>%
  arrange(DISC)

Correlation

df_corr <- df_comp %>%
  filter(
    # SUBSET != 'full'
    # EDGES >= 100
    ) %>%
  select(-c(LEMMA, SUBSET, START, END, SKIP, STAMP))
  
cor.test(df_corr$USES, df_corr$CENT_DEGREE)

    Pearson's product-moment correlation

data:  df_corr$USES and df_corr$CENT_DEGREE
t = -2.3949, df = 517, p-value = 0.01698
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.18911153 -0.01884815
sample estimates:
       cor 
-0.1047473 

Coefficient of variation

df_comp %>%
  filter(
    SUBSET == 'full',
    USES_TOT >= 1000
    ) %>%
  select(LEMMA, USES_TOT, COEF_VAR) %>%
  arrange(desc(COEF_VAR))

Processing status

Lemma list

df_comp %>%
  select(LEMMA, SUBSET, STAMP) %>%
  filter(SUBSET == 'four') %>%
  # mutate(STAMP = as_datetime(STAMP)) %>%
  arrange(desc(STAMP))

Dataset statistics

df_comp %>%
  filter(SUBSET == 'full') %>%
  select(LEMMA, SUBSET, USES_TOT, USERS_TOT) %>%
  dplyr::summarise(
    USES_ALL = sum(USES_TOT),
    USERS_ALL = sum(USERS_TOT)
    )
LS0tCmF1dGhvcjogJ1F1aXJpbiBXw7xyc2NoaW5nZXInCnRpdGxlOiAiU29jaWFsIG5ldHdvcmtzIG9mIGxleGljYWwgaW5ub3ZhdGlvbiIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOiAKICAgIHRvYzogeWVzCi0tLQoKIyBMb2FkIGNvZGUKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CnNvdXJjZSgnc3JjL2xvYWQtZGF0YS5SJykKc291cmNlKCdzcmMvcG9zdHByb2MuUicpCnNvdXJjZSgnc3JjL3VzZXMuUicpCnNvdXJjZSgnc3JjL3VzZXJzLlInKQpzb3VyY2UoJ3NyYy9zbmEuUicpCgpsaWJyYXJ5KGNvcnJyKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KG1hZ3JpdHRyKQpgYGAKCgojIFZhcmlhYmxlcwoKYGBge3IgaW5jbHVkZT1GQUxTRX0Kc3Vic2V0dGluZyA9ICd0aW1lJwpkaWZmX3N0YXJ0X21ldGhvZCA8LSAnZWRnZXMnCmRpZmZfc3RhcnRfbGltaXQgPC0gMwoKY2FzZXMgPC0gYygKICAndXBjeWNsaW5nJywKICAnYWx0LWxlZnQnLCAKICAnc29sb3ByZW5ldXInLAogICdoeXBlcmxvY2FsJwogICMgJ2dob3N0aW5nJywgCiAgIyAnbGl0dWF0aW9uJywgCiAgKQoKYGBgCgoKIyBMb2FkIGRhdGEKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CmlmIChleGlzdHMoJ2RmX2NvbXAnKSA9PSBGQUxTRSkgewogIGRmX2NvbXAgPC0gcmVhZF9kZl9jb21wKGZfcGF0aD0nb3V0L2RmX2NvbXAuY3N2JykKfQpgYGAKCgojIEZpbHRlciBkYXRhCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQpkZl9jb21wICU8PiUgCiAgZmlsdGVyKAogICAgU0tJUCAhPSBUUlVFLAogICAgU1VCU0VUVElORyA9PSBzdWJzZXR0aW5nLAogICAgIyBlc3RhYmxpc2hlZCB3b3JkcwogICAgIUxFTU1BICVpbiUgYygnQW5nbG8tU2F4b24nLCAnY2xpbWF0ZSBjcmlzaXMnLCAnZ2xvYmFsIGhlYXRpbmcnLCAnZ3JlZW53YXNoaW5nJywgJ3BvbGl0aWNhbCBjb3JyZWN0bmVzcycsICdyZWZ1Z2VlIGNyaXNpcyAnKQogICAgIyBzdWNjZXNzZnVsIHdvcmRzOiBVU0VTX1RPVCA+PSAxMDAwMAogICAgIyB1bnN1Y2Nlc3NmdWwgd29yZHM6IFVTRVNfVE9UIDw9IDEwMDAwCiAgICAjIHdlaXJkIHdvcmRzOiBiaWcgZGljayBlbmVyZ3kKICApCmBgYAoKCiMjIHN1Y2Nlc3MKCmBgYHtyfQpkZl9jb21wICU+JQogIHNlbGVjdChMRU1NQSwgU1VCU0VULCBVU0VTLCBDRU5UX0RFR1JFRSkgJT4lCiAgZmlsdGVyKFNVQlNFVCAhPSAnZnVsbCcpICU+JQogIGdyb3VwX2J5KExFTU1BKSAlPiUKICBtdXRhdGUoRElGRl9VU0VTID0gVVNFUyAtIGxhZyhVU0VTKSkgJT4lCiAgbXV0YXRlKERJRkZfVVNFU19UT1QgPSBzdW0oRElGRl9VU0VTLCBuYS5ybT1UUlVFKSkgJT4lCiAgZmlsdGVyKFNVQlNFVCA9PSAnZm91cicpICU+JQogIGFycmFuZ2UoRElGRl9VU0VTX1RPVCkKCnN1Y2Nlc3NmdWxfZGlmZnMgPC0gZGZfc3VjY2VzcyAlPiUKICBmaWx0ZXIoRElGRl9VU0VTX1RPVCA+IDApICU+JQogIHB1bGwoTEVNTUEpCgp1bnN1Y2Nlc3NmdWxfZGlmZnMgPC0gZGZfc3VjY2VzcyAlPiUKICBmaWx0ZXIoRElGRl9VU0VTX1RPVCA8IDApICU+JQogIHB1bGwoTEVNTUEpCgpzdWNjZXNzZnVsX3VzZXNfbWluIDwtIGRmX2NvbXAgJT4lCiAgZmlsdGVyKFVTRVMgPiAxMDAwKSAlPiUKICBwdWxsKExFTU1BKQogIAogIAp1bnN1Y2Nlc3NmdWxfdXNlc19taW4gPC0gZGZfY29tcCAlPiUKICBmaWx0ZXIoVVNFUyA8IDEwMDApICU+JQogIHB1bGwoTEVNTUEpCmBgYAoKCiMgU2luZ2xlIGxlbW1hCgojIyBMb2FkIGRhdGEKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CmNvcnB1cyA8LSAnL1ZvbHVtZXMvcWpkL3R3aW50LycKbGVtbWEgPC0gJ2JpZyBkaWNrIGVuZXJneScKCnR3ZWV0cyA8LSBsb2FkX2RhdGEoY29ycHVzLCBsZW1tYSkKdHdlZXRzIDwtIHBvc3Rwcm9jKHR3ZWV0cykKdHdlZXRzIDwtIGZpbHRlcl90d2VldHModHdlZXRzKQpgYGAKCgojIyBDaGVjayB0d2VldHMKCmBgYHtyfQp0d2VldHMgJT4lCiAgc2VsZWN0KHR3ZWV0LCBkYXRlKSAlPiUKICAjIHNsaWNlKC4sIHNhbXBsZSgxOm4oKSkpICNyYW5kb20gc2VsZWN0aW9uCiAgYXJyYW5nZShkYXRlKQpgYGAKCgojIyBDaGVjayB1c2VzIGFuZCBlZGdlcwoKYGBge3J9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKExFTU1BID09ICdoeXBlcmxvY2FsJykgJT4lCiAgc2VsZWN0KExFTU1BLCBVU0VTX1RPVCwgU1VCU0VULCBVU0VTKQpgYGAKCgojIENhc2Ugc3R1ZGllcwoKIyMgRGF0YSBvdmVydmlldwoKYGBge3IgaW5jbHVkZT1GQUxTRX0KZGZfY29tcCAlPiUKICBmaWx0ZXIoCiAgICBMRU1NQSAlaW4lIGNhc2VzLAogICAgU1VCU0VUID09ICdmdWxsJwogICAgKSAlPiUKICBzZWxlY3QoTEVNTUEsIFVTRVM9VVNFU19UT1QsIFNQRUFLRVJTPVVTRVJTX1RPVCkgJT4lCiAgbXV0YXRlKFVTRVNfUEVSX1NQRUFLRVIgPSBVU0VTIC8gU1BFQUtFUlMpICU+JQogIGFycmFuZ2UoZGVzYyhVU0VTKSkKICAjIGdncGxvdChkYXRhPS4sIGFlcyh4PVVTRVJTX1RPVCwgeT1VU0VTX1RPVCkpICsKICAjICAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1MRU1NQSkpICsKICAjICAgc2NhbGVfeV9jb250aW51b3VzKCdmcmVxdWVuY3kgKGxvZyknLCB0cmFucz0nbG9nJykKYGBgCgoKIyMgVXNhZ2UgZnJlcXVlbmN5CgojIyMgT3ZlcmFsbCBhY3Jvc3MgY2FzZXMKCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcigKICAgIExFTU1BICVpbiUgY2FzZXMsCiAgICBTVUJTRVQgPT0gJ2Z1bGwnCiAgICApICU+JQogICBhcnJhbmdlKGRlc2MoVVNFU19UT1QpKQpgYGAKCgojIyMgVXNlcyBpbiBmaXJzdCBzdWJzZXQKCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcigKICAgIFNVQlNFVFRJTkcgPT0gJ3RpbWUnLAogICAgU1VCU0VUID09ICdvbmUnCiAgICApICU+JQogIHNlbGVjdChMRU1NQSwgVVNFU19UT1QsIFVTRVMpICU+JQogIGFycmFuZ2UoVVNFUykKYGBgCgoKCiMjIERlZ3JlZSBjZW50cmFsaXphdGlvbgoKIyMjIERpYWNocm9uaWMKCmBgYHtyfQpwbHQgPC0gZGZfY29tcCAlPiUKICBzZWxlY3QoTEVNTUEsIFNVQlNFVFRJTkcsIFNVQlNFVCwgQ0VOVF9ERUdSRUUsIENFTlRfRVYsIERFTlNJVFkpICU+JQogIGZpbHRlcigKICAgIFNVQlNFVCAhPSAnZnVsbCcsCiAgICBMRU1NQSAlaW4lIGNhc2VzCiAgICAjIExFTU1BICVpbiUgYyhjYXNlcywgJ2h5cGVybG9jYWwnLCAnYmxvY2tjaGFpbicsICdjbGltYXRlIGRlbmlhbCcsICdtYW4gYnVuJywgJ3Vwc2tpbGwnLCAnZGVlcCBsZWFybmluZycpCiAgICAjIG92ZXJ0b3VyaXNtOiBkaWZmIHRvbyBiaWcgZm9yIGNhc2Ugc3R1ZHkgc2NhbGU7IAogICAgIyAsICdicm9mbGFrZScsICdjbGltYXRlIGNyaXNpcycsICdpbmNlbCcsICdvdmVydG91cmlzbScKICApICU+JQogIGdncGxvdCguLCBhZXMoeD1TVUJTRVQsIHk9Q0VOVF9ERUdSRUUpKSArICMgZ3JvdXA9MQogICAgZ2VvbV9wb2ludChhZXMoZ3JvdXA9TEVNTUEsIGNvbG9yPUxFTU1BLCBzaGFwZT1MRU1NQSkpICsKICAgIGdlb21fbGluZShhZXMoZ3JvdXA9TEVNTUEsIGNvbG9yPUxFTU1BLCBsaW5ldHlwZT1MRU1NQSkpICsKICAgIGd1aWRlcyhncm91cD1UUlVFKSArCiAgICBnZ3RpdGxlKCdEaWZmdXNpb24gb3ZlciB0aW1lOiBjaGFuZ2VzIGluIGRlZ3JlZSBjZW50cmFsaXphdGlvbicpICsKICAgIHNjYWxlX3lfY29udGludW91cygnZGVncmVlIGNlbnRyYWxpdHknKSArCiAgICBzY2FsZV94X2Rpc2NyZXRlKCdzdWJzZXQnKQoKZ2dwbG90bHkocGx0KQojIGdnc2F2ZSgnb3V0L2Nhc2VzX2NlbnRfZGlhYy5wZGYnLCB3aWR0aD02LCBoZWlnaHQ9NCkKYGBgCgoKIyMjIE92ZXJhbGwKCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcigKICAgIExFTU1BICVpbiUgY2FzZXMsCiAgICBTVUJTRVQgPT0gJ2Z1bGwnCiAgICApICU+JQogIHNlbGVjdCgKICAgIExFTU1BLCAKICAgIEVER0VTLAogICAgQ0VOVF9ERUdSRUUsIAogICAgQ0VOVF9FVgogICAgKSAlPiUKICBhcnJhbmdlKChDRU5UX0RFR1JFRSkpCmBgYAoKCiMgRnVsbCBzYW1wbGUKCiMjIFVzYWdlIGludGVuc2l0eQoKYGBge3J9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKFNVQlNFVCA9PSAnZnVsbCcpICU+JQogIGFycmFuZ2UoZGVzYyhVU0VTKSkKYGBgCgoKIyMgRWRnZXMKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CmRmX2NvbXAgJT4lCiAgZHBseXI6Omdyb3VwX2J5KExFTU1BKSAlPiUKICBmaWx0ZXIoU1VCU0VUID09ICdvbmUnKSAlPiUKICBzZWxlY3QoTEVNTUEsIFNVQlNFVCwgVVNFUywgRURHRVMpICU+JQogIGFycmFuZ2UoRURHRVMpCmBgYAoKCiMjIERlZ3JlZSBjZW50cmFsaXR5CgojIyMgT3ZlcmFsbAoKIyMjIyBMaXN0CgpgYGB7cn0KZGZfY29tcCAlPiUKICBzZWxlY3QoTEVNTUEsIFNVQlNFVCwgVVNFU19UT1QsIENFTlRfREVHUkVFLCBDRU5UX0VWKSAlPiUKICBmaWx0ZXIoCiAgICBTVUJTRVQgPT0gJ2Z1bGwnCiAgICAjIFVTRVMgPj0gMgogICAgKSAlPiUKICBhcnJhbmdlKAogICAgKENFTlRfREVHUkVFKQogICAgIyBkZXNjKENFTlRfRVYpCiAgKQpgYGAKCgojIyMjIFBsb3QKCmBgYHtyfQpwbHQgPC0gZGZfY29tcCAlPiUKICBzZWxlY3QoTEVNTUEsIFNVQlNFVCwgVVNFUywgQ0VOVF9ERUdSRUUpICU+JQogIGZpbHRlcihTVUJTRVQgPT0gJ2Z1bGwnKSAlPiUKICBhcnJhbmdlKChDRU5UX0RFR1JFRSkpICU+JQogIGdncGxvdCguLCBhZXMoeD1DRU5UX0RFR1JFRSwgeT1yZW9yZGVyKExFTU1BLCBDRU5UX0RFR1JFRSkpKSArCiAgICBnZW9tX3BvaW50KCkgKwogICAgc2NhbGVfeV9kaXNjcmV0ZSgnbGVtbWFzJykgKwogICAgc2NhbGVfeF9jb250aW51b3VzKAogICAgICAnZGVncmVlIGNlbnRyYWxpemF0aW9uIChsb2cpJywKICAgICAgdHJhbnM9J2xvZycKICAgICAgKQoKcGx0CgojIGdnc2F2ZSgnb3V0L2NlbnRfc3luY19hbGwucGRmJywgd2lkdGg9NiwgaGVpZ2h0PTQpCmBgYAoKCiMjIyBPdmVyIHRpbWUKCiMjIyMgQWNyb3NzIGFsbCBsZW1tYXMKCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcigKICAgIFNVQlNFVCAlaW4lIGMoJ29uZScsICd0d28nLCAndGhyZWUnLCAnZm91cicpLAogICAgTEVNTUEgJWluJSB1bnN1Y2Nlc3NmdWxfZGlmZnMKICAgICMgVVNFU19UT1QgPj0gMTAwMDAKICAgICMgVVNFUyA+IDEwMDAKICAgICkgJT4lCiAgZ3JvdXBfYnkoU1VCU0VUKSAlPiUKICBzdW1tYXJpemUoCiAgICBERU5TX0FWRyA9IG1lYW4oREVOU0lUWSksCiAgICBDRU5UX0FWRyA9IG1lYW4oQ0VOVF9ERUdSRUUpCiAgICApICU+JQogIGdncGxvdCguLCBhZXMoeD1TVUJTRVQsIHk9REVOU19BVkcsIGdyb3VwPTEpKSArCiAgICBnZW9tX2xpbmUoKSArCiAgICBnZW9tX3BvaW50KCkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKCdkZWdyZWUgY2VudHJhbGl6YXRpb24nKSArCiAgICBzY2FsZV94X2Rpc2NyZXRlKCdzdWJzZXRzJykKCiMgZ2dzYXZlKCdvdXQvZnVsbF9jZW50X2RpYWMucGRmJywgd2lkdGg9NiwgaGVpZ2h0PTQpCmBgYAoKCiMjIyMgQmlnZ2VzdCBjaGFuZ2VzCgpgYGB7cn0KZGZfY29tcCAlPiUKICBzZWxlY3QoTEVNTUEsIFNVQlNFVCwgQ0VOVF9ERUdSRUUsIEVER0VTLCBVU0VTX1RPVCkgJT4lCiAgZmlsdGVyKAogICAgU1VCU0VUICVpbiUgYygKICAgICAgJ29uZScsIAogICAgICAnZm91cicKICAgICAgKSwKICAgIFVTRVNfVE9UID49IDEwMDAwCiAgICApICU+JQogIGRwbHlyOjpncm91cF9ieShMRU1NQSkgJT4lCiAgZHBseXI6Om11dGF0ZShDRU5UX0RJRkYgPSBDRU5UX0RFR1JFRSAtIGxhZyhDRU5UX0RFR1JFRSwgZGVmYXVsdD1DRU5UX0RFR1JFRVsxXSkpICU+JQogIGRyb3BfbmEoKSAlPiUKICBzZWxlY3QoLVNVQlNFVCkgJT4lCiAgcmVuYW1lKAogICAgQ0VOVF9MQVNUID0gQ0VOVF9ERUdSRUUsCiAgICBFREdFU19MQVNUID0gRURHRVMKICAgICkgJT4lCiAgYXJyYW5nZSgoQ0VOVF9ESUZGKSkKYGBgCgoKIyMgRGVuc2l0eQoKYGBge3J9CmRmX2NvbXAgJT4lCiAgc2VsZWN0KExFTU1BLCBTVUJTRVQsIFVTRVNfVE9ULCBDRU5UX0RFR1JFRSwgREVOU0lUWSkgJT4lCiAgZmlsdGVyKFNVQlNFVCA9PSAnZm91cicpICU+JQogIGFycmFuZ2UoREVOU0lUWSkKYGBgCgoKIyBGcmVxdWVuY3kgdnMuIG5ldHdvcmtzCgojIyBGcmVxdWVuY3kgdnMuIGNlbnRyYWxpemF0aW9uCgojIyMgUGxvdAoKYGBge3J9CnBsdCA8LSBkZl9jb21wICU+JQogIGZpbHRlcigKICAgIFNVQlNFVCA9PSAnZm91cicsCiAgICAjIFVTRVNfVE9UICVpbiUgKDE1MDAwMDo1MDAwMDApCiAgICAjIExFTU1BICVpbiUgYyhjYXNlcykKICAgICMgIUxFTU1BICVpbiUgYygnc2x1dCBzaGFtaW5nJywgJ2Rhc2hjYW0nLCAnc2hhcmVhYmxlJywgJ2N1Y2tvbGQnLCAnZGVlcCBsZWFybmluZycsICdoeXBlcmxvY2FsJykKICAgICkgJT4lCiAgc2VsZWN0KExFTU1BLCBDRU5UX0RFR1JFRSwgVVNFU19UT1QsIFVTRVMsIEVER0VTKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHg9Q0VOVF9ERUdSRUUsIHk9VVNFU19UT1QpKSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsPUxFTU1BKSwgaGp1c3Q9LTAuMSwgdmp1c3Q9LTAuMSkgKyAKICAgICMgZ2VvbV9wb2ludCgpICsKICAgIHNjYWxlX3lfY29udGludW91cygKICAgICAgJ3VzYWdlIGZyZXF1ZW5jeSAobG9nKScsIAogICAgICB0cmFucz0nbG9nJwogICAgICApICsKICAgIHNjYWxlX3hfY29udGludW91cygKICAgICAgJ2RlZ3JlZSBjZW50cmFsaXphdGlvbicKICAgICAgIyB0cmFucz0nbG9nJwogICAgICApCgpnZ3Bsb3RseShwbHQpCiMgZ2dzYXZlKCdvdXQvZnVsbF9jZW50X2ZyZXFfb3ZlcmFsbC5wZGYnLCB3aWR0aD02LCBoZWlnaHQ9NCkKIyBnZ3NhdmUoJ291dC9jYXNlc19jZW50X2ZyZXFfb3ZlcmFsbC5wZGYnLCB3aWR0aD02LCBoZWlnaHQ9NCkKYGBgCgoKIyMjIEJpZ2dlc3QgZGlzY3JlcGFuY2llcwoKYGBge3J9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKAogICAgU1VCU0VUVElORyA9PSAndGltZScsCiAgICBTVUJTRVQgPT0gJ2ZvdXInCiAgICApICU+JQogIHNlbGVjdChMRU1NQSwgVVNFU19UT1QsIENFTlRfREVHUkVFKSAlPiUKICBtdXRhdGUoRElTQyA9IFVTRVNfVE9UIC8gQ0VOVF9ERUdSRUUpICU+JQogIGFycmFuZ2UoRElTQykKYGBgCgoKIyMjIENvcnJlbGF0aW9uCgpgYGB7cn0KZGZfY29yciA8LSBkZl9jb21wICU+JQogIGZpbHRlcigKICAgICMgU1VCU0VUICE9ICdmdWxsJwogICAgIyBFREdFUyA+PSAxMDAKICAgICkgJT4lCiAgc2VsZWN0KC1jKExFTU1BLCBTVUJTRVQsIFNUQVJULCBFTkQsIFNLSVAsIFNUQU1QKSkKICAKY29yLnRlc3QoZGZfY29yciRVU0VTLCBkZl9jb3JyJENFTlRfREVHUkVFKQpgYGAKCgojIENvZWZmaWNpZW50IG9mIHZhcmlhdGlvbgoKYGBge3J9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKAogICAgU1VCU0VUID09ICdmdWxsJywKICAgIFVTRVNfVE9UID49IDEwMDAKICAgICkgJT4lCiAgc2VsZWN0KExFTU1BLCBVU0VTX1RPVCwgQ09FRl9WQVIpICU+JQogIGFycmFuZ2UoZGVzYyhDT0VGX1ZBUikpCmBgYAoKCiMgUHJvY2Vzc2luZyBzdGF0dXMKCiMjIExlbW1hIGxpc3QKCmBgYHtyfQpkZl9jb21wICU+JQogIHNlbGVjdChMRU1NQSwgU1VCU0VULCBTVEFNUCkgJT4lCiAgZmlsdGVyKFNVQlNFVCA9PSAnZm91cicpICU+JQogICMgbXV0YXRlKFNUQU1QID0gYXNfZGF0ZXRpbWUoU1RBTVApKSAlPiUKICBhcnJhbmdlKGRlc2MoU1RBTVApKQpgYGAKCgojIyBEYXRhc2V0IHN0YXRpc3RpY3MKCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcihTVUJTRVQgPT0gJ2Z1bGwnKSAlPiUKICBzZWxlY3QoTEVNTUEsIFNVQlNFVCwgVVNFU19UT1QsIFVTRVJTX1RPVCkgJT4lCiAgZHBseXI6OnN1bW1hcmlzZSgKICAgIFVTRVNfQUxMID0gc3VtKFVTRVNfVE9UKSwKICAgIFVTRVJTX0FMTCA9IHN1bShVU0VSU19UT1QpCiAgICApCmBgYA==